/*!
 * \file WtHftEngine.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief HFT高频交易引擎头文件
 * 
 * 本文件定义了HFT(High Frequency Trading)高频交易引擎类，
 * 用于处理高频交易策略的执行、Level2数据处理、委托队列、
 * 委托明细、成交明细等高频交易相关功能。
 */
#pragma once
#include "WtEngine.h"
#include "WtLocalExecuter.h"

#include "../Includes/IHftStraCtx.h"

NS_WTP_BEGIN

class WTSVariant;
class WtHftRtTicker;

typedef std::shared_ptr<IHftStraCtx> HftContextPtr;

/**
 * @class WtHftEngine
 * @brief HFT高频交易引擎类
 * 
 * HFT引擎是WonderTrader系统中专门用于高频交易的核心组件，
 * 继承自WtEngine基类，提供高频交易策略的运行环境。
 * 
 * 主要功能包括：
 * - 高频策略管理和执行
 * - Level2数据处理（委托队列、委托明细、成交明细）
 * - 微秒级行情数据处理
 * - 高频交易信号生成和执行
 * - 策略上下文管理
 * 
 * @note HFT引擎专门针对高频交易场景优化，支持微秒级延迟
 * @see WtEngine, IHftStraCtx
 */
class WtHftEngine :	public WtEngine
{
public:
	/**
	 * @brief 构造函数
	 * 
	 * 初始化HFT引擎实例
	 */
	WtHftEngine();
	
	/**
	 * @brief 析构函数
	 * 
	 * 清理HFT引擎资源
	 */
	virtual ~WtHftEngine();

public:
	//////////////////////////////////////////////////////////////////////////
	//WtEngine 接口
	
	/**
	 * @brief 初始化HFT引擎
	 * 
	 * 设置基础数据管理器、数据管理器、热点管理器等核心组件
	 * 
	 * @param cfg 配置对象
	 * @param bdMgr 基础数据管理器
	 * @param dataMgr 数据管理器
	 * @param hotMgr 热点管理器
	 * @param notifier 事件通知器
	 */
	virtual void init(WTSVariant* cfg, IBaseDataMgr* bdMgr, WtDtMgr* dataMgr, IHotMgr* hotMgr, EventNotifier* notifier) override;

	/**
	 * @brief 启动HFT引擎
	 * 
	 * 初始化行情处理器，启动引擎运行
	 * 
	 * @param bAsync 是否异步运行，默认为false
	 */
	virtual void run(bool bAsync = false) override;

	/**
	 * @brief 处理推送的行情数据
	 * 
	 * @param newTick 新的行情数据
	 * @param hotFlag 热点标志
	 */
	virtual void handle_push_quote(WTSTickData* newTick, uint32_t hotFlag) override;
	
	/**
	 * @brief 处理推送的委托明细数据
	 * 
	 * @param curOrdDtl 当前委托明细数据
	 */
	virtual void handle_push_order_detail(WTSOrdDtlData* curOrdDtl) override;
	
	/**
	 * @brief 处理推送的委托队列数据
	 * 
	 * @param curOrdQue 当前委托队列数据
	 */
	virtual void handle_push_order_queue(WTSOrdQueData* curOrdQue) override;
	
	/**
	 * @brief 处理推送的成交明细数据
	 * 
	 * @param curTrans 当前成交明细数据
	 */
	virtual void handle_push_transaction(WTSTransData* curTrans) override;

	/**
	 * @brief 处理行情数据
	 * 
	 * 处理新的行情数据，通知相关策略
	 * 
	 * @param stdCode 标准合约代码
	 * @param curTick 当前行情数据
	 */
	virtual void on_tick(const char* stdCode, WTSTickData* curTick) override;

	/**
	 * @brief 处理K线数据
	 * 
	 * 当新的K线数据生成时调用，通知订阅了该K线的策略
	 * 
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param times K线倍数
	 * @param newBar 新的K线数据
	 */
	virtual void on_bar(const char* stdCode, const char* period, uint32_t times, WTSBarStruct* newBar) override;

	/**
	 * @brief 交易时段开始回调
	 * 
	 * 在每个交易时段开始时调用
	 */
	virtual void on_session_begin() override;

	/**
	 * @brief 交易时段结束回调
	 * 
	 * 在每个交易时段结束时调用
	 */
	virtual void on_session_end() override;

public:
	/**
	 * @brief 获取委托队列切片数据
	 * 
	 * @param sid 策略ID
	 * @param stdCode 标准合约代码
	 * @param count 数据条数
	 * @return WTSOrdQueSlice* 委托队列切片数据指针
	 */
	WTSOrdQueSlice* get_order_queue_slice(uint32_t sid, const char* stdCode, uint32_t count);
	
	/**
	 * @brief 获取委托明细切片数据
	 * 
	 * @param sid 策略ID
	 * @param stdCode 标准合约代码
	 * @param count 数据条数
	 * @return WTSOrdDtlSlice* 委托明细切片数据指针
	 */
	WTSOrdDtlSlice* get_order_detail_slice(uint32_t sid, const char* stdCode, uint32_t count);
	
	/**
	 * @brief 获取成交明细切片数据
	 * 
	 * @param sid 策略ID
	 * @param stdCode 标准合约代码
	 * @param count 数据条数
	 * @return WTSTransSlice* 成交明细切片数据指针
	 */
	WTSTransSlice* get_transaction_slice(uint32_t sid, const char* stdCode, uint32_t count);

public:
	/**
	 * @brief 分钟结束回调
	 * 
	 * 在每分钟结束时调用
	 * 
	 * @param curDate 当前日期
	 * @param curTime 当前时间
	 */
	void on_minute_end(uint32_t curDate, uint32_t curTime);

	/**
	 * @brief 添加HFT策略上下文
	 * 
	 * 将策略上下文添加到引擎的策略映射表中
	 * 
	 * @param ctx HFT策略上下文智能指针
	 */
	void addContext(HftContextPtr ctx);

	/**
	 * @brief 获取HFT策略上下文
	 * 
	 * 根据策略ID获取对应的策略上下文
	 * 
	 * @param id 策略ID
	 * @return HftContextPtr 策略上下文智能指针，如果不存在则返回空指针
	 */
	HftContextPtr	getContext(uint32_t id);

	/**
	 * @brief 订阅委托队列数据
	 * 
	 * @param sid 策略ID
	 * @param stdCode 标准合约代码
	 */
	void sub_order_queue(uint32_t sid, const char* stdCode);
	
	/**
	 * @brief 订阅委托明细数据
	 * 
	 * @param sid 策略ID
	 * @param stdCode 标准合约代码
	 */
	void sub_order_detail(uint32_t sid, const char* stdCode);
	
	/**
	 * @brief 订阅成交明细数据
	 * 
	 * @param sid 策略ID
	 * @param stdCode 标准合约代码
	 */
	void sub_transaction(uint32_t sid, const char* stdCode);

private:
	typedef faster_hashmap<uint32_t, HftContextPtr> ContextMap;
	ContextMap		_ctx_map;			///< 策略上下文映射表

	WtHftRtTicker*	_tm_ticker;			///< HFT实时行情处理器
	WTSVariant*		_cfg;				///< 配置对象


	StraSubMap		_ordque_sub_map;	///< 委托队列订阅表
	StraSubMap		_orddtl_sub_map;	///< 委托明细订阅表
	StraSubMap		_trans_sub_map;		///< 成交明细订阅表
};

NS_WTP_END